package com.koron.common.core.util;

/**
 * @author twcao
 * @description 经纬度计算公式
 * @project sitemanagement
 * @classname DistanceUtils
 * @date 2020/6/29 15:56
 */
public class DistanceUtils {

    /**
     * 地球平均半径,单位：m；不是赤道半径。赤道为6378左右
     */
    private static final double EARTH_RADIUS = 6371393;

    /**
     * @描述 反余弦进行计算
     * @参数  [lon1, lat1, lon2, lat2]
     * @返回值  double 两个经纬度之间的距离，单位为m
     **/
    public static double getDistance(Double lon1,Double lat1,Double lon2, Double lat2) {
        if(Double.compare(lon1, lon2) == 0 && Double.compare(lat1, lat2) == 0) {
            // 如果两点的经度和纬度相同，则是同一个点，距离直接计算出0
            return 0;
        }
        // 经纬度（角度）转弧度。弧度用作参数，以调用Math.cos和Math.sin
        double radiansAX = Math.toRadians(lon1); // A经弧度
        double radiansAY = Math.toRadians(lat1); // A纬弧度
        double radiansBX = Math.toRadians(lon2); // B经弧度
        double radiansBY = Math.toRadians(lat2); // B纬弧度
        // 公式中“cosβ1cosβ2cos（α1-α2）+sinβ1sinβ2”的部分，得到∠AOB的cos值
        double cos = Math.cos(radiansAY) * Math.cos(radiansBY) * Math.cos(radiansAX - radiansBX) + Math.sin(radiansAY) * Math.sin(radiansBY);
        // 反余弦值
        double acos = Math.acos(cos);
        if(Double.isNaN(acos)) {
            // 如果计算出无穷大数据，则计算结果异常，直接返回0
            return 0;
        }
        return EARTH_RADIUS * acos;
    }
}
